package edu.ustb.efws.monitor.service;

import edu.ustb.efws.base.domain.Detector;
import org.springframework.stereotype.Service;

import java.time.Duration;
import java.util.List;
import java.util.OptionalLong;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
/**
 * 设备采集数据监控
 *
 * @author TS Group
 */
@Service
public class DetectorMonitorService {
    //最大等待数据时间
    private static final long MAX_WAIT = Duration.ofMinutes(5).toMillis();
    //设备访问最后时间
    private final ConcurrentMap<Integer, Long> LAST_TIMES = new ConcurrentHashMap<>();

    /**
     * 初始监控设备
     *
     * @param detectors 监控设备集合
     */
    public void init(List<Detector> detectors){
        for(Detector detector: detectors){
            if(detector.getCollect()){
                LAST_TIMES.put(detector.getId(), -1L);
            }
        }
    }

    /**
     * 设备存活
     *
     * @param detId 设备编号
     */
    public void active(int detId){
        LAST_TIMES.put(detId, System.currentTimeMillis());
    }

    /**
     * 判断设备是否激活
     *
     * @param detId 设备编号
     * @return true 激活
     */
    public boolean isActive(int detId){
        long now = System.currentTimeMillis();
        long lastTime = LAST_TIMES.getOrDefault(detId, now);
        return (now - lastTime) < MAX_WAIT;
    }

    /**
     * 获取设备数据最后采集时间
     *
     * @param detId 设备编号
     * @return 最后采集时间
     */
    public OptionalLong getLastTime(int detId){
        Long lastTime =  LAST_TIMES.get(detId);

        return lastTime == null || lastTime == -1L ?
                OptionalLong.empty(): OptionalLong.of(lastTime);
    }

}
